#ifndef __USB_HID_KBD_H__
#define __USB_HID_KBD_H__

// clang-format off
#include <stdint.h>
#include "include/ch5xx.h"
#include "include/ch5xx_usb.h"
// clang-format on

#define KEY_LEFT_CTRL 0x80
#define KEY_LEFT_SHIFT 0x81
#define KEY_LEFT_ALT 0x82
#define KEY_LEFT_GUI 0x83
#define KEY_RIGHT_CTRL 0x84
#define KEY_RIGHT_SHIFT 0x85
#define KEY_RIGHT_ALT 0x86
#define KEY_RIGHT_GUI 0x87

#define KEY_UP_ARROW 0xDA
#define KEY_DOWN_ARROW 0xD9
#define KEY_LEFT_ARROW 0xD8
#define KEY_RIGHT_ARROW 0xD7
#define KEY_BACKSPACE 0xB2
#define KEY_TAB 0xB3
#define KEY_RETURN 0xB0
#define KEY_ESC 0xB1
#define KEY_INSERT 0xD1
#define KEY_DELETE 0xD4
#define KEY_PAGE_UP 0xD3
#define KEY_PAGE_DOWN 0xD6
#define KEY_HOME 0xD2
#define KEY_END 0xD5
#define KEY_CAPS_LOCK 0xC1
#define KEY_F1 0xC2
#define KEY_F2 0xC3
#define KEY_F3 0xC4
#define KEY_F4 0xC5
#define KEY_F5 0xC6
#define KEY_F6 0xC7
#define KEY_F7 0xC8
#define KEY_F8 0xC9
#define KEY_F9 0xCA
#define KEY_F10 0xCB
#define KEY_F11 0xCC
#define KEY_F12 0xCD
#define KEY_F13 0xF0
#define KEY_F14 0xF1
#define KEY_F15 0xF2
#define KEY_F16 0xF3
#define KEY_F17 0xF4
#define KEY_F18 0xF5
#define KEY_F19 0xF6
#define KEY_F20 0xF7
#define KEY_F21 0xF8
#define KEY_F22 0xF9
#define KEY_F23 0xFA
#define KEY_F24 0xFB

enum ConsumerKeycode {
  // Some keys might only work with linux
  CONSUMER_POWER = 0x30,
  CONSUMER_SLEEP = 0x32,

  MEDIA_RECORD = 0xB2,
  MEDIA_FAST_FORWARD = 0xB3,
  MEDIA_REWIND = 0xB4,
  MEDIA_NEXT = 0xB5,
  MEDIA_PREVIOUS = 0xB6,
  MEDIA_PREV = 0xB6, // Alias
  MEDIA_STOP = 0xB7,
  MEDIA_PLAY_PAUSE = 0xCD,
  MEDIA_PAUSE = 0xB0,

  MEDIA_VOLUME_MUTE = 0xE2,
  MEDIA_VOL_MUTE = 0xE2, // Alias
  MEDIA_VOLUME_UP = 0xE9,
  MEDIA_VOL_UP = 0xE9, // Alias
  MEDIA_VOLUME_DOWN = 0xEA,
  MEDIA_VOL_DOWN = 0xEA, // Alias

  CONSUMER_BRIGHTNESS_UP = 0x006F,
  CONSUMER_BRIGHTNESS_DOWN = 0x0070,

  CONSUMER_SCREENSAVER = 0x19e,

  CONSUMER_PROGRAMMABLE_BUTTON_CONFIGURATION = 0x182,
  CONSUMER_CONTROL_CONFIGURATION = 0x183,
  CONSUMER_EMAIL_READER = 0x18A,
  CONSUMER_CALCULATOR = 0x192,
  CONSUMER_EXPLORER = 0x194,

  CONSUMER_BROWSER_HOME = 0x223,
  CONSUMER_BROWSER_BACK = 0x224,
  CONSUMER_BROWSER_FORWARD = 0x225,
  CONSUMER_BROWSER_REFRESH = 0x227,
  CONSUMER_BROWSER_BOOKMARKS = 0x22A,

  // Consumer_Page_(0x0C)    0x15
  HID_CONSUMER_UNASSIGNED = 0x00,
  HID_CONSUMER_NUMERIC_KEY_PAD = 0x02,      // HID type NARY
  HID_CONSUMER_PROGRAMMABLE_BUTTONS = 0x03, // HID type NARY
  HID_CONSUMER_MICROPHONE_CA = 0x04,
  HID_CONSUMER_HEADPHONE_CA = 0x05,
  HID_CONSUMER_GRAPHIC_EQUALIZER_CA = 0x06,
  // Reserved    = 0x07-1F
  HID_CONSUMER_PLUS_10 = 0x20,     // HID type OSC
  HID_CONSUMER_PLUS_100 = 0x21,    // HID type OSC
  HID_CONSUMER_AM_SLASH_PM = 0x22, // HID type OSC
  // Reserved    = 0x23-3F
  HID_CONSUMER_POWER = 0x30,            // HID type OOC
  HID_CONSUMER_RESET = 0x31,            // HID type OSC
  HID_CONSUMER_SLEEP = 0x32,            // HID type OSC
  HID_CONSUMER_SLEEP_AFTER = 0x33,      // HID type OSC
  HID_CONSUMER_SLEEP_MODE = 0x34,       // HID type RTC
  HID_CONSUMER_ILLUMINATION = 0x35,     // HID type OOC
  HID_CONSUMER_FUNCTION_BUTTONS = 0x36, // HID type NARY
  // Reserved    = 0x37-3F
  HID_CONSUMER_MENU = 0x40,                // HID type OOC
  HID_CONSUMER_MENU_PICK = 0x41,           // HID type OSC
  HID_CONSUMER_MENU_UP = 0x42,             // HID type OSC
  HID_CONSUMER_MENU_DOWN = 0x43,           // HID type OSC
  HID_CONSUMER_MENU_LEFT = 0x44,           // HID type OSC
  HID_CONSUMER_MENU_RIGHT = 0x45,          // HID type OSC
  HID_CONSUMER_MENU_ESCAPE = 0x46,         // HID type OSC
  HID_CONSUMER_MENU_VALUE_INCREASE = 0x47, // HID type OSC
  HID_CONSUMER_MENU_VALUE_DECREASE = 0x48, // HID type OSC
  // Reserved 0x49-5F
  HID_CONSUMER_DATA_ON_SCREEN = 0x60,        // HID type OOC
  HID_CONSUMER_CLOSED_CAPTION = 0x61,        // HID type OOC
  HID_CONSUMER_CLOSED_CAPTION_SELECT = 0x62, // HID type OSC
  HID_CONSUMER_VCR_SLASH_TV = 0x63,          // HID type OOC
  HID_CONSUMER_BROADCAST_MODE = 0x64,        // HID type OSC
  HID_CONSUMER_SNAPSHOT = 0x65,              // HID type OSC
  HID_CONSUMER_STILL = 0x66,                 // HID type OSC
  // Reserved 0x67-7F
  HID_CONSUMER_SELECTION = 0x80,                  // HID type NARY
  HID_CONSUMER_ASSIGN_SELECTION = 0x81,           // HID type OSC
  HID_CONSUMER_MODE_STEP = 0x82,                  // HID type OSC
  HID_CONSUMER_RECALL_LAST = 0x83,                // HID type OSC
  HID_CONSUMER_ENTER_CHANNEL = 0x84,              // HID type OSC
  HID_CONSUMER_ORDER_MOVIE = 0x85,                // HID type OSC
  HID_CONSUMER_CHANNEL = 0x86,                    // HID type LC
  HID_CONSUMER_MEDIA_SELECTION = 0x87,            // HID type NARY
  HID_CONSUMER_MEDIA_SELECT_COMPUTER = 0x88,      // HID type SEL
  HID_CONSUMER_MEDIA_SELECT_TV = 0x89,            // HID type SEL
  HID_CONSUMER_MEDIA_SELECT_WWW = 0x8A,           // HID type SEL
  HID_CONSUMER_MEDIA_SELECT_DVD = 0x8B,           // HID type SEL
  HID_CONSUMER_MEDIA_SELECT_TELEPHONE = 0x8C,     // HID type SEL
  HID_CONSUMER_MEDIA_SELECT_PROGRAM_GUIDE = 0x8D, // HID type SEL
  HID_CONSUMER_MEDIA_SELECT_VIDEO_PHONE = 0x8E,   // HID type SEL
  HID_CONSUMER_MEDIA_SELECT_GAMES = 0x8F,         // HID type SEL
  HID_CONSUMER_MEDIA_SELECT_MESSAGES = 0x90,      // HID type SEL
  HID_CONSUMER_MEDIA_SELECT_CD = 0x91,            // HID type SEL
  HID_CONSUMER_MEDIA_SELECT_VCR = 0x92,           // HID type SEL
  HID_CONSUMER_MEDIA_SELECT_TUNER = 0x93,         // HID type SEL
  HID_CONSUMER_QUIT = 0x94,                       // HID type OSC
  HID_CONSUMER_HELP = 0x95,                       // HID type OOC
  HID_CONSUMER_MEDIA_SELECT_TAPE = 0x96,          // HID type SEL
  HID_CONSUMER_MEDIA_SELECT_CABLE = 0x97,         // HID type SEL
  HID_CONSUMER_MEDIA_SELECT_SATELLITE = 0x98,     // HID type SEL
  HID_CONSUMER_MEDIA_SELECT_SECURITY = 0x99,      // HID type SEL
  HID_CONSUMER_MEDIA_SELECT_HOME = 0x9A,          // HID type SEL
  HID_CONSUMER_MEDIA_SELECT_CALL = 0x9B,          // HID type SEL
  HID_CONSUMER_CHANNEL_INCREMENT = 0x9C,          // HID type OSC
  HID_CONSUMER_CHANNEL_DECREMENT = 0x9D,          // HID type OSC
  HID_CONSUMER_MEDIA_SELECT_SAP = 0x9E,           // HID type SEL
  // Reserved 0x9F
  HID_CONSUMER_VCR_PLUS = 0xA0, // HID type OSC
  HID_CONSUMER_ONCE = 0xA1,     // HID type OSC
  HID_CONSUMER_DAILY = 0xA2,    // HID type OSC
  HID_CONSUMER_WEEKLY = 0xA3,   // HID type OSC
  HID_CONSUMER_MONTHLY = 0xA4,  // HID type OSC
  // Reserved 0xA5-AF
  HID_CONSUMER_PLAY = 0xB0,                // HID type OOC
  HID_CONSUMER_PAUSE = 0xB1,               // HID type OOC
  HID_CONSUMER_RECORD = 0xB2,              // HID type OOC
  HID_CONSUMER_FAST_FORWARD = 0xB3,        // HID type OOC
  HID_CONSUMER_REWIND = 0xB4,              // HID type OOC
  HID_CONSUMER_SCAN_NEXT_TRACK = 0xB5,     // HID type OSC
  HID_CONSUMER_SCAN_PREVIOUS_TRACK = 0xB6, // HID type OSC
  HID_CONSUMER_STOP = 0xB7,                // HID type OSC
  HID_CONSUMER_EJECT = 0xB8,               // HID type OSC
  HID_CONSUMER_RANDOM_PLAY = 0xB9,         // HID type OOC
  HID_CONSUMER_SELECT_DISC = 0xBA,         // HID type NARY
  HID_CONSUMER_ENTER_DISC_MC = 0xBB,
  HID_CONSUMER_REPEAT = 0xBC,                // HID type OSC
  HID_CONSUMER_TRACKING = 0xBD,              // HID type LC
  HID_CONSUMER_TRACK_NORMAL = 0xBE,          // HID type OSC
  HID_CONSUMER_SLOW_TRACKING = 0xBF,         // HID type LC
  HID_CONSUMER_FRAME_FORWARD = 0xC0,         // HID type RTC
  HID_CONSUMER_FRAME_BACK = 0xC1,            // HID type RTC
  HID_CONSUMER_MARK = 0xC2,                  // HID type OSC
  HID_CONSUMER_CLEAR_MARK = 0xC3,            // HID type OSC
  HID_CONSUMER_REPEAT_FROM_MARK = 0xC4,      // HID type OOC
  HID_CONSUMER_RETURN_TO_MARK = 0xC5,        // HID type OSC
  HID_CONSUMER_SEARCH_MARK_FORWARD = 0xC6,   // HID type OSC
  HID_CONSUMER_SEARCH_MARK_BACKWARDS = 0xC7, // HID type OSC
  HID_CONSUMER_COUNTER_RESET = 0xC8,         // HID type OSC
  HID_CONSUMER_SHOW_COUNTER = 0xC9,          // HID type OSC
  HID_CONSUMER_TRACKING_INCREMENT = 0xCA,    // HID type RTC
  HID_CONSUMER_TRACKING_DECREMENT = 0xCB,    // HID type RTC
  HID_CONSUMER_STOP_SLASH_EJECT = 0xCC,      // HID type OSC
  HID_CONSUMER_PLAY_SLASH_PAUSE = 0xCD,      // HID type OSC
  HID_CONSUMER_PLAY_SLASH_SKIP = 0xCE,       // HID type OSC
  // Reserved 0xCF-DF
  HID_CONSUMER_VOLUME = 0xE0,           // HID type LC
  HID_CONSUMER_BALANCE = 0xE1,          // HID type LC
  HID_CONSUMER_MUTE = 0xE2,             // HID type OOC
  HID_CONSUMER_BASS = 0xE3,             // HID type LC
  HID_CONSUMER_TREBLE = 0xE4,           // HID type LC
  HID_CONSUMER_BASS_BOOST = 0xE5,       // HID type OOC
  HID_CONSUMER_SURROUND_MODE = 0xE6,    // HID type OSC
  HID_CONSUMER_LOUDNESS = 0xE7,         // HID type OOC
  HID_CONSUMER_MPX = 0xE8,              // HID type OOC
  HID_CONSUMER_VOLUME_INCREMENT = 0xE9, // HID type RTC
  HID_CONSUMER_VOLUME_DECREMENT = 0xEA, // HID type RTC
  // Reserved 0xEB-EF
  HID_CONSUMER_SPEED_SELECT = 0xF0,   // HID type OSC
  HID_CONSUMER_PLAYBACK_SPEED = 0xF1, // HID type NARY
  HID_CONSUMER_STANDARD_PLAY = 0xF2,  // HID type SEL
  HID_CONSUMER_LONG_PLAY = 0xF3,      // HID type SEL
  HID_CONSUMER_EXTENDED_PLAY = 0xF4,  // HID type SEL
  HID_CONSUMER_SLOW = 0xF5,           // HID type OSC
  // Reserved 0xF6-FF
  HID_CONSUMER_FAN_ENABLE = 0x100,               // HID type OOC
  HID_CONSUMER_FAN_SPEED = 0x101,                // HID type LC
  HID_CONSUMER_LIGHT_ENABLE = 0x102,             // HID type OOC
  HID_CONSUMER_LIGHT_ILLUMINATION_LEVEL = 0x103, // HID type LC
  HID_CONSUMER_CLIMATE_CONTROL_ENABLE = 0x104,   // HID type OOC
  HID_CONSUMER_ROOM_TEMPERATURE = 0x105,         // HID type LC
  HID_CONSUMER_SECURITY_ENABLE = 0x106,          // HID type OOC
  HID_CONSUMER_FIRE_ALARM = 0x107,               // HID type OSC
  HID_CONSUMER_POLICE_ALARM = 0x108,             // HID type OSC
  HID_CONSUMER_PROXIMITY = 0x109,                // HID type LC
  HID_CONSUMER_MOTION = 0x10A,                   // HID type OSC
  HID_CONSUMER_DURESS_ALARM = 0x10B,             // HID type OSC
  HID_CONSUMER_HOLDUP_ALARM = 0x10C,             // HID type OSC
  HID_CONSUMER_MEDICAL_ALARM = 0x10D,            // HID type OSC
  // Reserved 0x10E-14F
  HID_CONSUMER_BALANCE_RIGHT = 0x150,    // HID type RTC
  HID_CONSUMER_BALANCE_LEFT = 0x151,     // HID type RTC
  HID_CONSUMER_BASS_INCREMENT = 0x152,   // HID type RTC
  HID_CONSUMER_BASS_DECREMENT = 0x153,   // HID type RTC
  HID_CONSUMER_TREBLE_INCREMENT = 0x154, // HID type RTC
  HID_CONSUMER_TREBLE_DECREMENT = 0x155, // HID type RTC
  // Reserved 0x156-15F
  HID_CONSUMER_SPEAKER_SYSTEM = 0x160,                    // HID type CL
  HID_CONSUMER_CHANNEL_LEFT = 0x161,                      // HID type CL
  HID_CONSUMER_CHANNEL_RIGHT = 0x162,                     // HID type CL
  HID_CONSUMER_CHANNEL_CENTER = 0x163,                    // HID type CL
  HID_CONSUMER_CHANNEL_FRONT = 0x164,                     // HID type CL
  HID_CONSUMER_CHANNEL_CENTER_FRONT = 0x165,              // HID type CL
  HID_CONSUMER_CHANNEL_SIDE = 0x166,                      // HID type CL
  HID_CONSUMER_CHANNEL_SURROUND = 0x167,                  // HID type CL
  HID_CONSUMER_CHANNEL_LOW_FREQUENCY_ENHANCEMENT = 0x168, // HID type CL
  HID_CONSUMER_CHANNEL_TOP = 0x169,                       // HID type CL
  HID_CONSUMER_CHANNEL_UNKNOWN = 0x16A,                   // HID type CL
  // Reserved 0x16B-16F
  HID_CONSUMER_SUB_CHANNEL = 0x170,               // HID type LC
  HID_CONSUMER_SUB_CHANNEL_INCREMENT = 0x171,     // HID type OSC
  HID_CONSUMER_SUB_CHANNEL_DECREMENT = 0x172,     // HID type OSC
  HID_CONSUMER_ALTERNATE_AUDIO_INCREMENT = 0x173, // HID type OSC
  HID_CONSUMER_ALTERNATE_AUDIO_DECREMENT = 0x174, // HID type OSC
  // Reserved 0x175-17F
  HID_CONSUMER_APPLICATION_LAUNCH_BUTTONS = 0x180,             // HID type NARY
  HID_CONSUMER_AL_LAUNCH_BUTTON_CONFIGURATION_TOOL = 0x181,    // HID type SEL
  HID_CONSUMER_AL_PROGRAMMABLE_BUTTON_CONFIGURATION = 0x182,   // HID type SEL
  HID_CONSUMER_AL_CONSUMER_CONTROL_CONFIGURATION = 0x183,      // HID type SEL
  HID_CONSUMER_AL_WORD_PROCESSOR = 0x184,                      // HID type SEL
  HID_CONSUMER_AL_TEXT_EDITOR = 0x185,                         // HID type SEL
  HID_CONSUMER_AL_SPREADSHEET = 0x186,                         // HID type SEL
  HID_CONSUMER_AL_GRAPHICS_EDITOR = 0x187,                     // HID type SEL
  HID_CONSUMER_AL_PRESENTATION_APP = 0x188,                    // HID type SEL
  HID_CONSUMER_AL_DATABASE_APP = 0x189,                        // HID type SEL
  HID_CONSUMER_AL_EMAIL_READER = 0x18A,                        // HID type SEL
  HID_CONSUMER_AL_NEWSREADER = 0x18B,                          // HID type SEL
  HID_CONSUMER_AL_VOICEMAIL = 0x18C,                           // HID type SEL
  HID_CONSUMER_AL_CONTACTS_SLASH_ADDRESS_BOOK = 0x18D,         // HID type SEL
  HID_CONSUMER_AL_CALENDAR_SLASH_SCHEDULE = 0x18E,             // HID type SEL
  HID_CONSUMER_AL_TASK_SLASH_PROJECT_MANAGER = 0x18F,          // HID type SEL
  HID_CONSUMER_AL_LOG_SLASH_JOURNAL_SLASH_TIMECARD = 0x190,    // HID type SEL
  HID_CONSUMER_AL_CHECKBOOK_SLASH_FINANCE = 0x191,             // HID type SEL
  HID_CONSUMER_AL_CALCULATOR = 0x192,                          // HID type SEL
  HID_CONSUMER_AL_A_SLASH_V_CAPTURE_SLASH_PLAYBACK = 0x193,    // HID type SEL
  HID_CONSUMER_AL_LOCAL_MACHINE_BROWSER = 0x194,               // HID type SEL
  HID_CONSUMER_AL_LAN_SLASH_WAN_BROWSER = 0x195,               // HID type SEL
  HID_CONSUMER_AL_INTERNET_BROWSER = 0x196,                    // HID type SEL
  HID_CONSUMER_AL_REMOTE_NETWORKING_SLASH_ISP_CONNECT = 0x197, // HID type SEL
  HID_CONSUMER_AL_NETWORK_CONFERENCE = 0x198,                  // HID type SEL
  HID_CONSUMER_AL_NETWORK_CHAT = 0x199,                        // HID type SEL
  HID_CONSUMER_AL_TELEPHONY_SLASH_DIALER = 0x19A,              // HID type SEL
  HID_CONSUMER_AL_LOGON = 0x19B,                               // HID type SEL
  HID_CONSUMER_AL_LOGOFF = 0x19C,                              // HID type SEL
  HID_CONSUMER_AL_LOGON_SLASH_LOGOFF = 0x19D,                  // HID type SEL
  HID_CONSUMER_AL_TERMINAL_LOCK_SLASH_SCREENSAVER = 0x19E,     // HID type SEL
  HID_CONSUMER_AL_CONTROL_PANEL = 0x19F,                       // HID type SEL
  HID_CONSUMER_AL_COMMAND_LINE_PROCESSOR_SLASH_RUN = 0x1A0,    // HID type SEL
  HID_CONSUMER_AL_PROCESS_SLASH_TASK_MANAGER = 0x1A1,          // HID type SEL
  HID_CONSUMER_AL_SELECT_TASK_SLASH_APPLICATION = 0x1A2,       // HID type SEL
  HID_CONSUMER_AL_NEXT_TASK_SLASH_APPLICATION = 0x1A3,         // HID type SEL
  HID_CONSUMER_AL_PREVIOUS_TASK_SLASH_APPLICATION = 0x1A4,     // HID type SEL
  HID_CONSUMER_AL_PREEMPTIVE_HALT_TASK_SLASH_APPLICATION =
      0x1A5,                                      // HID type SEL
  HID_CONSUMER_AL_INTEGRATED_HELP_CENTER = 0x1A6, // HID type SEL
  HID_CONSUMER_AL_DOCUMENTS = 0x1A7,              // HID type SEL
  HID_CONSUMER_AL_THESAURUS = 0x1A8,              // HID type SEL
  HID_CONSUMER_AL_DICTIONARY = 0x1A9,             // HID type SEL
  HID_CONSUMER_AL_DESKTOP = 0x1AA,                // HID type SEL
  HID_CONSUMER_AL_SPELL_CHECK = 0x1AB,            // HID type SEL
  HID_CONSUMER_AL_GRAMMAR_CHECK = 0x1AC,          // HID type SEL
  HID_CONSUMER_AL_WIRELESS_STATUS = 0x1AD,        // HID type SEL
  HID_CONSUMER_AL_KEYBOARD_LAYOUT = 0x1AE,        // HID type SEL
  HID_CONSUMER_AL_VIRUS_PROTECTION = 0x1AF,       // HID type SEL
  HID_CONSUMER_AL_ENCRYPTION = 0x1B0,             // HID type SEL
  HID_CONSUMER_AL_SCREEN_SAVER = 0x1B1,           // HID type SEL
  HID_CONSUMER_AL_ALARMS = 0x1B2,                 // HID type SEL
  HID_CONSUMER_AL_CLOCK = 0x1B3,                  // HID type SEL
  HID_CONSUMER_AL_FILE_BROWSER = 0x1B4,           // HID type SEL
  HID_CONSUMER_AL_POWER_STATUS = 0x1B5,           // HID type SEL
  HID_CONSUMER_AL_IMAGE_BROWSER = 0x1B6,          // HID type SEL
  HID_CONSUMER_AL_AUDIO_BROWSER = 0x1B7,          // HID type SEL
  HID_CONSUMER_AL_MOVIE_BROWSER = 0x1B8,          // HID type SEL
  HID_CONSUMER_AL_DIGITAL_RIGHTS_MANAGER = 0x1B9, // HID type SEL
  HID_CONSUMER_AL_DIGITAL_WALLET = 0x1BA,         // HID type SEL
  // _Reserved 0x1BB
  HID_CONSUMER_AL_INSTANT_MESSAGING = 0x1BC, // HID type SEL
  HID_CONSUMER_AL_OEM_FEATURES_SLASH__TIPS_SLASH_TUTORIAL_BROWSER =
      0x1BD,                                                    // HID type SEL
  HID_CONSUMER_AL_OEM_HELP = 0x1BE,                             // HID type SEL
  HID_CONSUMER_AL_ONLINE_COMMUNITY = 0x1BF,                     // HID type SEL
  HID_CONSUMER_AL_ENTERTAINMENT_CONTENT_BROWSER = 0x1C0,        // HID type SEL
  HID_CONSUMER_AL_ONLINE_SHOPPING_BROWSER = 0x1C1,              // HID type SEL
  HID_CONSUMER_AL_SMARTCARD_INFORMATION_SLASH_HELP = 0x1C2,     // HID type SEL
  HID_CONSUMER_AL_MARKET_MONITOR_SLASH_FINANCE_BROWSER = 0x1C3, // HID type SEL
  HID_CONSUMER_AL_CUSTOMIZED_CORPORATE_NEWS_BROWSER = 0x1C4,    // HID type SEL
  HID_CONSUMER_AL_ONLINE_ACTIVITY_BROWSER = 0x1C5,              // HID type SEL
  HID_CONSUMER_AL_RESEARCH_SLASH_SEARCH_BROWSER = 0x1C6,        // HID type SEL
  HID_CONSUMER_AL_AUDIO_PLAYER = 0x1C7,                         // HID type SEL
  // Reserved 0x1C8-1FF
  HID_CONSUMER_GENERIC_GUI_APPLICATION_CONTROLS = 0x200, // HID type NARY
  HID_CONSUMER_AC_NEW = 0x201,                           // HID type SEL
  HID_CONSUMER_AC_OPEN = 0x202,                          // HID type SEL
  HID_CONSUMER_AC_CLOSE = 0x203,                         // HID type SEL
  HID_CONSUMER_AC_EXIT = 0x204,                          // HID type SEL
  HID_CONSUMER_AC_MAXIMIZE = 0x205,                      // HID type SEL
  HID_CONSUMER_AC_MINIMIZE = 0x206,                      // HID type SEL
  HID_CONSUMER_AC_SAVE = 0x207,                          // HID type SEL
  HID_CONSUMER_AC_PRINT = 0x208,                         // HID type SEL
  HID_CONSUMER_AC_PROPERTIES = 0x209,                    // HID type SEL
  HID_CONSUMER_AC_UNDO = 0x21A,                          // HID type SEL
  HID_CONSUMER_AC_COPY = 0x21B,                          // HID type SEL
  HID_CONSUMER_AC_CUT = 0x21C,                           // HID type SEL
  HID_CONSUMER_AC_PASTE = 0x21D,                         // HID type SEL
  HID_CONSUMER_AC_SELECT_ALL = 0x21E,                    // HID type SEL
  HID_CONSUMER_AC_FIND = 0x21F,                          // HID type SEL
  HID_CONSUMER_AC_FIND_AND_REPLACE = 0x220,              // HID type SEL
  HID_CONSUMER_AC_SEARCH = 0x221,                        // HID type SEL
  HID_CONSUMER_AC_GO_TO = 0x222,                         // HID type SEL
  HID_CONSUMER_AC_HOME = 0x223,                          // HID type SEL
  HID_CONSUMER_AC_BACK = 0x224,                          // HID type SEL
  HID_CONSUMER_AC_FORWARD = 0x225,                       // HID type SEL
  HID_CONSUMER_AC_STOP = 0x226,                          // HID type SEL
  HID_CONSUMER_AC_REFRESH = 0x227,                       // HID type SEL
  HID_CONSUMER_AC_PREVIOUS_LINK = 0x228,                 // HID type SEL
  HID_CONSUMER_AC_NEXT_LINK = 0x229,                     // HID type SEL
  HID_CONSUMER_AC_BOOKMARKS = 0x22A,                     // HID type SEL
  HID_CONSUMER_AC_HISTORY = 0x22B,                       // HID type SEL
  HID_CONSUMER_AC_SUBSCRIPTIONS = 0x22C,                 // HID type SEL
  HID_CONSUMER_AC_ZOOM_IN = 0x22D,                       // HID type SEL
  HID_CONSUMER_AC_ZOOM_OUT = 0x22E,                      // HID type SEL
  HID_CONSUMER_AC_ZOOM = 0x22F,                          // HID type LC
  HID_CONSUMER_AC_FULL_SCREEN_VIEW = 0x230,              // HID type SEL
  HID_CONSUMER_AC_NORMAL_VIEW = 0x231,                   // HID type SEL
  HID_CONSUMER_AC_VIEW_TOGGLE = 0x232,                   // HID type SEL
  HID_CONSUMER_AC_SCROLL_UP = 0x233,                     // HID type SEL
  HID_CONSUMER_AC_SCROLL_DOWN = 0x234,                   // HID type SEL
  HID_CONSUMER_AC_SCROLL = 0x235,                        // HID type LC
  HID_CONSUMER_AC_PAN_LEFT = 0x236,                      // HID type SEL
  HID_CONSUMER_AC_PAN_RIGHT = 0x237,                     // HID type SEL
  HID_CONSUMER_AC_PAN = 0x238,                           // HID type LC
  HID_CONSUMER_AC_NEW_WINDOW = 0x239,                    // HID type SEL
  HID_CONSUMER_AC_TILE_HORIZONTALLY = 0x23A,             // HID type SEL
  HID_CONSUMER_AC_TILE_VERTICALLY = 0x23B,               // HID type SEL
  HID_CONSUMER_AC_FORMAT = 0x23C,                        // HID type SEL
  HID_CONSUMER_AC_EDIT = 0x23D,                          // HID type SEL
  HID_CONSUMER_AC_BOLD = 0x23E,                          // HID type SEL
  HID_CONSUMER_AC_ITALICS = 0x23F,                       // HID type SEL
  HID_CONSUMER_AC_UNDERLINE = 0x240,                     // HID type SEL
  HID_CONSUMER_AC_STRIKETHROUGH = 0x241,                 // HID type SEL
  HID_CONSUMER_AC_SUBSCRIPT = 0x242,                     // HID type SEL
  HID_CONSUMER_AC_SUPERSCRIPT = 0x243,                   // HID type SEL
  HID_CONSUMER_AC_ALL_CAPS = 0x244,                      // HID type SEL
  HID_CONSUMER_AC_ROTATE = 0x245,                        // HID type SEL
  HID_CONSUMER_AC_RESIZE = 0x246,                        // HID type SEL
  HID_CONSUMER_AC_FLIP_HORIZONTAL = 0x247,               // HID type SEL
  HID_CONSUMER_AC_FLIP_VERTICAL = 0x248,                 // HID type SEL
  HID_CONSUMER_AC_MIRROR_HORIZONTAL = 0x249,             // HID type SEL
  HID_CONSUMER_AC_MIRROR_VERTICAL = 0x24A,               // HID type SEL
  HID_CONSUMER_AC_FONT_SELECT = 0x24B,                   // HID type SEL
  HID_CONSUMER_AC_FONT_COLOR = 0x24C,                    // HID type SEL
  HID_CONSUMER_AC_FONT_SIZE = 0x24D,                     // HID type SEL
  HID_CONSUMER_AC_JUSTIFY_LEFT = 0x24E,                  // HID type SEL
  HID_CONSUMER_AC_JUSTIFY_CENTER_H = 0x24F,              // HID type SEL
  HID_CONSUMER_AC_JUSTIFY_RIGHT = 0x250,                 // HID type SEL
  HID_CONSUMER_AC_JUSTIFY_BLOCK_H = 0x251,               // HID type SEL
  HID_CONSUMER_AC_JUSTIFY_TOP = 0x252,                   // HID type SEL
  HID_CONSUMER_AC_JUSTIFY_CENTER_V = 0x253,              // HID type SEL
  HID_CONSUMER_AC_JUSTIFY_BOTTOM = 0x254,                // HID type SEL
  HID_CONSUMER_AC_JUSTIFY_BLOCK_V = 0x255,               // HID type SEL
  HID_CONSUMER_AC_INDENT_DECREASE = 0x256,               // HID type SEL
  HID_CONSUMER_AC_INDENT_INCREASE = 0x257,               // HID type SEL
  HID_CONSUMER_AC_NUMBERED_LIST = 0x258,                 // HID type SEL
  HID_CONSUMER_AC_RESTART_NUMBERING = 0x259,             // HID type SEL
  HID_CONSUMER_AC_BULLETED_LIST = 0x25A,                 // HID type SEL
  HID_CONSUMER_AC_PROMOTE = 0x25B,                       // HID type SEL
  HID_CONSUMER_AC_DEMOTE = 0x25C,                        // HID type SEL
  HID_CONSUMER_AC_YES = 0x25D,                           // HID type SEL
  HID_CONSUMER_AC_NO = 0x25E,                            // HID type SEL
  HID_CONSUMER_AC_CANCEL = 0x25F,                        // HID type SEL
  HID_CONSUMER_AC_CATALOG = 0x260,                       // HID type SEL
  HID_CONSUMER_AC_BUY_SLASH_CHECKOUT = 0x261,            // HID type SEL
  HID_CONSUMER_AC_ADD_TO_CART = 0x262,                   // HID type SEL
  HID_CONSUMER_AC_EXPAND = 0x263,                        // HID type SEL
  HID_CONSUMER_AC_EXPAND_ALL = 0x264,                    // HID type SEL
  HID_CONSUMER_AC_COLLAPSE = 0x265,                      // HID type SEL
  HID_CONSUMER_AC_COLLAPSE_ALL = 0x266,                  // HID type SEL
  HID_CONSUMER_AC_PRINT_PREVIEW = 0x267,                 // HID type SEL
  HID_CONSUMER_AC_PASTE_SPECIAL = 0x268,                 // HID type SEL
  HID_CONSUMER_AC_INSERT_MODE = 0x269,                   // HID type SEL
  HID_CONSUMER_AC_DELETE = 0x26A,                        // HID type SEL
  HID_CONSUMER_AC_LOCK = 0x26B,                          // HID type SEL
  HID_CONSUMER_AC_UNLOCK = 0x26C,                        // HID type SEL
  HID_CONSUMER_AC_PROTECT = 0x26D,                       // HID type SEL
  HID_CONSUMER_AC_UNPROTECT = 0x26E,                     // HID type SEL
  HID_CONSUMER_AC_ATTACH_COMMENT = 0x26F,                // HID type SEL
  HID_CONSUMER_AC_DELETE_COMMENT = 0x270,                // HID type SEL
  HID_CONSUMER_AC_VIEW_COMMENT = 0x271,                  // HID type SEL
  HID_CONSUMER_AC_SELECT_WORD = 0x272,                   // HID type SEL
  HID_CONSUMER_AC_SELECT_SENTENCE = 0x273,               // HID type SEL
  HID_CONSUMER_AC_SELECT_PARAGRAPH = 0x274,              // HID type SEL
  HID_CONSUMER_AC_SELECT_COLUMN = 0x275,                 // HID type SEL
  HID_CONSUMER_AC_SELECT_ROW = 0x276,                    // HID type SEL
  HID_CONSUMER_AC_SELECT_TABLE = 0x277,                  // HID type SEL
  HID_CONSUMER_AC_SELECT_OBJECT = 0x278,                 // HID type SEL
  HID_CONSUMER_AC_REDO_SLASH_REPEAT = 0x279,             // HID type SEL
  HID_CONSUMER_AC_SORT = 0x27A,                          // HID type SEL
  HID_CONSUMER_AC_SORT_ASCENDING = 0x27B,                // HID type SEL
  HID_CONSUMER_AC_SORT_DESCENDING = 0x27C,               // HID type SEL
  HID_CONSUMER_AC_FILTER = 0x27D,                        // HID type SEL
  HID_CONSUMER_AC_SET_CLOCK = 0x27E,                     // HID type SEL
  HID_CONSUMER_AC_VIEW_CLOCK = 0x27F,                    // HID type SEL
  HID_CONSUMER_AC_SELECT_TIME_ZONE = 0x280,              // HID type SEL
  HID_CONSUMER_AC_EDIT_TIME_ZONES = 0x281,               // HID type SEL
  HID_CONSUMER_AC_SET_ALARM = 0x282,                     // HID type SEL
  HID_CONSUMER_AC_CLEAR_ALARM = 0x283,                   // HID type SEL
  HID_CONSUMER_AC_SNOOZE_ALARM = 0x284,                  // HID type SEL
  HID_CONSUMER_AC_RESET_ALARM = 0x285,                   // HID type SEL
  HID_CONSUMER_AC_SYNCHRONIZE = 0x286,                   // HID type SEL
  HID_CONSUMER_AC_SEND_SLASH_RECEIVE = 0x287,            // HID type SEL
  HID_CONSUMER_AC_SEND_TO = 0x288,                       // HID type SEL
  HID_CONSUMER_AC_REPLY = 0x289,                         // HID type SEL
  HID_CONSUMER_AC_REPLY_ALL = 0x28A,                     // HID type SEL
  HID_CONSUMER_AC_FORWARD_MSG = 0x28B,                   // HID type SEL
  HID_CONSUMER_AC_SEND = 0x28C,                          // HID type SEL
  HID_CONSUMER_AC_ATTACH_FILE = 0x28D,                   // HID type SEL
  HID_CONSUMER_AC_UPLOAD = 0x28E,                        // HID type SEL
  HID_CONSUMER_AC_DOWNLOAD_SAVE_TARGET_AS = 0x28F,       // HID type SEL
  HID_CONSUMER_AC_SET_BORDERS = 0x290,                   // HID type SEL
  HID_CONSUMER_AC_INSERT_ROW = 0x291,                    // HID type SEL
  HID_CONSUMER_AC_INSERT_COLUMN = 0x292,                 // HID type SEL
  HID_CONSUMER_AC_INSERT_FILE = 0x293,                   // HID type SEL
  HID_CONSUMER_AC_INSERT_PICTURE = 0x294,                // HID type SEL
  HID_CONSUMER_AC_INSERT_OBJECT = 0x295,                 // HID type SEL
  HID_CONSUMER_AC_INSERT_SYMBOL = 0x296,                 // HID type SEL
  HID_CONSUMER_AC_SAVE_AND_CLOSE = 0x297,                // HID type SEL
  HID_CONSUMER_AC_RENAME = 0x298,                        // HID type SEL
  HID_CONSUMER_AC_MERGE = 0x299,                         // HID type SEL
  HID_CONSUMER_AC_SPLIT = 0x29A,                         // HID type SEL
  HID_CONSUMER_AC_DISRIBUTE_HORIZONTALLY = 0x29B,        // HID type SEL
  HID_CONSUMER_AC_DISTRIBUTE_VERTICALLY = 0x29C,         // HID type SEL
};

#ifdef __cplusplus
extern "C" {
#endif

void USBInit(void);

uint8_t Keyboard_press(__data uint8_t k);
uint8_t Keyboard_release(__data uint8_t k);
void Keyboard_releaseAll(void);

uint8_t Keyboard_write(__data uint8_t c);

uint8_t Consumer_press(__data uint16_t k);
uint8_t Consumer_release(__data uint16_t k);
void Consumer_releaseAll(void);

uint8_t Consumer_write(__data uint16_t c);

uint8_t Keyboard_getLEDStatus();

#ifdef __cplusplus
} // extern "C"
#endif

#endif
